数据序列化语言
JSON
JSON(JavaScript Object Notation)是存储和交换文本信息的语法,类似 XML,JSON 比 XML 更小、更快,更易解析。JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。
{
"employees": [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName":"Carter" }
]
}
JSON 语法规则
JSON语法是JavaScript对象表示法语法的子集,使用简单标记储存文本数据类型。
-
JSON定义的数据类型包括:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
null
- 数组(在方括号中):数组元素是JSON类型;
- 对象(在花括号中):对象封装了字典,每个成员及其值构成字典的键值对,值是JSON类型。
数组元素和对象的成员的值可以嵌套JSON对象。
-
同一级数据由逗号分隔
-
花括号定义对象
-
方括号定义数组
JSON不支持添加注释。注释内容可以作为数据的一个字段(例如_comment
)
https://raw.githubusercontent.com/microsoft/winget-cli/master/schemas/JSON/settings/settings.schema.0.2.json
JSONPath查询语言
JSONPath Syntax | AlertSite Documentation (smartbear.com)
访问路径
$
表示对象或数组的根,以绝对路径访问元素。省略$
则直接以当前节点的键名访问数据。
直接子节点内容
选择元素可使用.KEY
或['KEY']
运算符,获取当前节点的子元素。(中括号表达可处理特殊标识符,如包含括号)
$.store.book[0].title # dot notation
$['store']['book'][0]['title'] # bracket notation
任意层级节点内容
X..KEY
:递归获取键名为KEY
的值。
数组内容
下标访问
$.store.book[0,1,3,...] # 获取固定顺序位置的值
$.store.book[0:10:2] # 获取数组切片的值
$.store.book[5:] # 省略切片区间结束位置
$.store.book[:10] # 省略
$.store.book[-1:-5] # 反向迭代
使用表达式确定下标:
# $.store.book[(expression)]
$.store.book[(@.length-1)] # $.store.book[-1]
条件过滤
获取满足条件的所有数组元素构成的列表。
# $.store.book[?(expression)]
$.store.book[?(@.price)] # 存在price字段
$.store.book[?(@.price < 10)] # book.price < 10
@
用于引用当前节点名。
返回当前对象或数组的所有元素:*
可以匹配任意键名或数组下标。
$.store.book[*]
获取数据元素字段
$.store.book[*].title # 所有数组元素的title字段的值组成的序列
YAML
YAML is primarily a data serialization language. XML was designed to be backwards compatible with the Standard Generalized Markup Language (SGML), which was designed to support structured documentation. XML therefore had many design constraints placed on it that YAML does not share. XML is a pioneer in many domains, YAML is the result of lessons learned from XML and other technologies.
语法
YAML可视为JSON的超集(YAML不支持重复的key,JSON允许出现重复key)1。
基本元素类型
序列
- Mark McGwire
- Sammy Sosa
- Ken Griffey
字典
hr: 65 # Home runs
avg: 0.278 # Batting average
rbi: 147 # Runs Batted In
字符串
YAML支持无引号、双引号和单引号表示字符串。字符串支持换行(换行符被替换),其中双引号可包含转义序列。
unicode: "Sosa did fine.\u263A"
control: "\b1998\t1999\t2000\n"
hex esc: "\x0d\x0a is \r\n"
single: '"Howdy!" he cried.'
quoted: ' # Not a ''comment''.'
tie-fighter: '|\-*-/|'
文本块
使用|
或>
声明文本块。
text_block: | # 保留换行
Mark McGwire's
year was crippled
by a knee injury.
text_block2: > # 将换行替换为空格,单独空行与额外缩进内容的换行将得到保留
Sammy Sosa completed another
fine season with great stats.
63 Home Runs
0.288 Batting Average
What a year!
注释
#
及其后内容为注释内容。
复合类型
序列类型和字典类型可以相互嵌套。
值为序列的字典
american:
- Boston Red Sox
- Detroit Tigers
- New York Yankees
national: [New York Mets, Chicago Cubs, Atlanta Braves]
元素为字典的序列
-
name: Mark McGwire
hr: 65
avg: 0.278
- item : Super Hoop # 紧凑写法
quantity: 1
- {name: Sammy Sosa, hr: 63, avg: 0.288} # 以{}确定范围,可以换行,无需对齐缩进
复杂映射类型
使用?
可定义除字符串外复杂的映射键类型(如序列和字典):
? - Detroit Tigers
- Chicago cubs
:
- 2001-07-23
? [ New York Yankees, Atlanta Braves ]
: [ 2001-07-02, 2001-08-12, 2001-08-14 ]
类型标记
整数字面值
canonical: 12345
decimal: +12345
octal: 0o14
hexadecimal: 0xC
浮点数字面值
canonical: 1.23015e+3
exponential: 12.3015e+02
fixed: 1230.15
negative infinity: -.inf
not a number: .NaN
时间日期字面值
canonical: 2001-12-15T02:59:43.1Z
iso8601: 2001-12-14t21:59:43.10-05:00
spaced: 2001-12-14 21:59:43.10 -5
date: 2002-12-14
其他类型
null: # 空值
booleans: [ true, false ]
string: '012345' # 默认字面值类型都为字符串文本
显式类型声明
not-date: !!str 2002-04-28 # 表示字符串而非日期
picture: !!binary | # 二进制编码序列
R0lGODlhDAAMAIQAAP//9/X
17unp5WZmZgAAAOfn515eXv
Pz7Y6OjuDg4J+fn5OTk6enp
56enmleECcgggoBADs=
--- !!set # Sets are special Mapping where key is mapped to null value
? Mark McGwire
? Sammy Sosa
? Ken Griff
--- !!omap # Ordered maps
- Mark McGwire: 65
- Sammy Sosa: 63
- Ken Griffy: 58
自定义类型声明
结构
一个yaml
文件可包含多个YAML文档,每个文档以---
行开始。...
用于显式声明一个文档的结束,后续直到发现---
才开始新的文档(通常用于流式传输)。
锚点与引用
在需要引用的对象前添加&id_obj
,在其他位置引用该对象使用*id_obj
。
bill-to: &id001
given : Chris
family : Dumars
address:
lines: |
458 Walkman Dr.
Suite #292
city : Royal Oak
state : MI
postal : 48046
ship-to: *id001 # refer to the above address information block
参考文献
Oren Ben-Kiki, Clark Evans, Ingy döt Net, YAML Ain’t Markup Language (YAML™) Version 1.2, 3rd Edition, Revision 1.2.2 (2021-10-01), YAML Language Development Team.